/**
 * 字符串 string
 * 数字 number
 * 长整型 bigint
 * 布尔 boolean
 * 数组 array
 * 对象 object
 * 空 null
 * 未定义 undefined
 * 未知 unknown
 * 无法到达 never
 */

/**
 * 联合类型 string | undefined | null
 */

interface Book {
  _id?: lhlx
  title: string
  obj: jclx
}
// 联合类型 接收string undefined null
type lhlx = string | null
type lhlx2 = number | bigint | null | string
type lhlx3 = undefined | object


// 交叉类型 string | null
type jclx = lhlx & lhlx2
// never
const obj: lhlx & lhlx3 = '123' as never
const obj1: number & string = '123' as never

// 类型别名
type book = Array<Book>
const tableData: book = []

// 类型索引
interface Item {
  name: string
  age: number
  value:string
}
type itemKey = keyof Item
// const obj2:itemKey = {
//   name: '',
//   age: 18
// }

// 类型约束
type yues = string | number
type yueshu = string | bigint | symbol
// const yslx: Array<yues extends yueshu> = [] 关键字 extends 启约束
// string | number | bigint | symbol


/**映射
 * 可选 Partial<T>
 * 只读 Readonly<T>
 * 创建 Record<K,T>
 * 选择 Pick<T,K>
 * 排除 Omint<T,K>
 * 
 * 
 * 
 * 返回类型 ReturnType<T>
 */
interface person {
  name:string
  age:number
}
//将类型中的所有属性映射为可选属性
//person {  name？:string;age？:number}
type per1 = Partial<person>
//将类型中的所有属性映射为只读属性 关键字 readonly
//person { readonly  name？:string;age？:number}
type per2 = Readonly<person>
//映射一个新的类型
type per3 = Record<string,person>
// const data : per3 ={'key' : { name:'王小虎',age:16}}
//映射一个可选类属性
type per4=Pick<person,'name' | 'age'>
//  const o :per4={name:'123',age:123}
//映射出一个没有K的属性
type per5 = Omit<person,'value'>
// const o:per5={
//   name:'123',
//   age:123
// }
// type PartialPerson= Readonly<person>
// type  PhoneBook = Record<string,{name: string; phone: string}>
//条件类型
type NonFunction <T>=T extends Function ? never : T

const num : number =1
//三元表达式
// num===1 ? 'true' : 'false'
//泛型，为了未来使用函数使留好类型参数
function re<T>(para:T):T{
return para
}
re({name:'王小虎',age:18}, {title:'标题内容',major:'软件技术'})
interface ReturnItem<T> {
  name:T,
  age:number
}
const i :ReturnItem<number>={
  name:123,
  age:123
}
class ts3<T> {
  public static function name(params:T) :T{
    return params
  }
  // readonly test(i:T)=> {
  // }
}
// re({name:'王小虎',age:19,value:true})
















,